// 基于Callback 编写异步的典型写法
// sucessCB, errorCB是getBlog函数的参数，同时也是回调函数
var getBlog = (sucessCB, errorCB) => {
    // 业务逻辑处理, 发起一次网络请求, 耗时1秒, 操作1秒就会报超时错误
    // timeOut在1-2s之间，可能是1.2, 0.8, 1.3
    var timeOut = Math.random() * 2;
    console.log('set timeout to: ' + timeOut + ' seconds.');

    // 设置一个超时时间, 1000毫秒后 执行 超时的处理函数, 这是花1秒来模拟网络IO
    setTimeout(() => {
        // 已经过来1秒
        // 通过timeOut 这个随机的值 来模拟请求的成功或者失败
        if (timeOut < 1) {
            // 成功 把成功的结果给到 回调函数
            // 同步返回: return "success"
            sucessCB("success")
        } else {
            // 失败 把失败的结果给到 回调函数
            // 同步返回: return error
            errorCB(new Error("failed"))
        }
    }, 1000)
}

// 常规的手动写法
// getBlog((resp) => { console.log(resp)}, (err) => { console.log(err)})

// getBlog 由于有2个参数 successCB(any) void, failedCB(any) volid满足Promise模式
// 构造出一个 Promise对象
var p = new Promise(getBlog)

// 使用async + await + promise
// 使用一个Promise 的异步函数, 在异步函数中 可以直接使用await 来等待promise对象的结果
// async不是函数名而是关键字，用于声明一个函数为异步函数，而await关键字则用于等待一个Promise对象的解析
var test = async () => {
    try {
    // 由于是异步函数，会交给执行器执行，执行完以后会返回给异步函数一个返回值
        let  resp = await p
        console.log(resp)
    } catch (err) {
        console.log(err)
    }
}
test()

